<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/3/26 0026
 * Time: 21:48
 */
//找到以1或者8或者9结尾的手机号
//$pat = '/\b1[0-9]{9}(8|9)\b/'; //在小括号的表达式称为子表达式 子表达式会开辟空间存储
//$pat = '/\b1[0-9]{9}9\b/'; 以1开头以9结尾的手机号(手机号以数组的形式存储)
//$pat = '/\b([a-z])\w+\1\b/';//后面得\1表示使用第一个子表达式的值可以用顺序区分开首尾相同字母的单词
//$pat = '/\b(\d{3})\d{4}(\d{4})\b/';$res = preg_replace($pat,'\1****\2',$str);手机号隐藏
//$pat = '/\b152.+?7\b/';找到一个符合条件的数据就停止(非贪婪)
//$pat = '/\b152.+1/';找到符合条件的后再继续查找直到结束贪婪
//$pat = '/\bhello\b/'; 找到所有的hello
//$pat = '/\b[hello]\w/'找到以hello开头的字符串
//$pat = '/[^h]\w+/';找到不以hello开头的字符串
//$pat = '/\Bhello\B/';找到两边都有字母的hello
//$pat ='/\s/'; //表示所有的空白字符

//1  .  明确匹配一个字符 除了换行字符
//preg_match('/./', 'a php 5', $matches); //一个字符 a
//preg_match_all('/./', 'a php 5', $matches);// 包含每个字符 包括空白字符
//var_dump($matches);
//2  ? 标志着前面的字符或则正则子正则式(可选)  非贪婪
//preg_match('/PHP.?5/', 'PHP 5PHP 5PHP 5', $matches);
//preg_match_all('/PHP 5.+?/','PHP 5 PHP 5PHP 5',$matches);

//3  + 匹配 钱苗苗字符或者子正则式一次或者多次
//preg_match('/a+b/', 'caaabc daaab', $matches);
//preg_match_all('/a+b/', 'caaabc daaab', $matches);

//4 * 匹配前面的字符零次或者多次
//preg_match('/de*f/','deeeef deeeef',$matches);
//preg_match_all('/de*f/','deeeef deeeef',$matches);
//5 {m} {m,n} 匹配签名的的字符串或者子正则式的m次 m到n次 可以省略m或者n 如果逗号前面没有胡子,他表示匹配的数字较低分分界线是 0 而高的分界线由逗号后面得数字决定 如果逗号后面得数字空缺 这高的分界线没有确定
//preg_match('/fo{1,3}bar/','foooobar',$matches);
//preg_match_all('/fo{1,3}bar/','fooobar',$matches);
//6 ^ 标志标题的开始
//preg_match('/^gdf/','gdfsadas  gdf dads',$matches);
//preg_match_all('/^gdf/',"gdfsadas \n gdfdads",$matches);
//7 $ 标志标题的结束 (除非最后一个字符是换行(\n) 那种情况下 他将只匹配换行符之前的字符 不对吧)
//preg_match('/Derick$/',"Rethans Derick\n",$matches);
//preg_match_all('/Derick$/',"Rethans Derick Rethans Derick",$matches);
//8 [...] 用开始和结束方框让多个字符组成一个字符类 你可以使用它创建一组字符进行匹配 使用一个字符类的连接符可以创建多个字符范围 如果在类中使用脱字符(^) 他将否定字符类 意思是指它不匹配字符类中的列出的任何一个字符
//preg_match('/[0-9]+/','PHP is released in 2005.',$matches);
preg_match('/[0-9]+/', 'PHP is released in 2005.', $matches);
// - 用来创建一个范围  ] 结束一个字符类 ^用来否定一个字符类
//9 (...) 创建一个子正则式 他可以用来在一个正则式中组织一些元素 例如 PHP in 2005 我们想同时把世纪和年 解析为两个单独实体
//preg_match('@([12][0-9])([0-9]{2})@', 'PHP in 2005', $matches);
preg_match('@([12][0-9]){1,2}([0-9]{2})@', 'PHP in 2005', $matches);
preg_match('@([12][0-9]{1,3})([0-9]{2})@', 'PHP in 2005', $matches);
preg_match('@([12][0-9]{0,})([0-9]{2})@', 'PHP in 2005', $matches);
//var_dump($matches);die;
//array(3) {
//    [0]=>
//  string(4) "2005"
//    [1]=>
//  string(2) "20"
//    [2]=>
//  string(2) "05"
//}
//索引为0的元素总是完全匹配 而所有的子正则式都根绝他们的在正则中出现的顺序 分配一个数字索引
//10 (?:...)创建一个在输出中不会获取的子正则式 你可以使用这个来表示正则式后跟随的内容
preg_match('/([A-Za-z]+)(?:hans)/','Derick Rethans',$matches);
//array(2) {
//    [0]=>
//  string(7) "Rethans"
//    [1]=>
//  string(3) "Ret"
//}
preg_match('/([A-Za-z ]+)(?:hans)/','Derick Rethans',$matches);
//array(2) {
//    [0]=>
//  string(14) "Derick Rethans"
//    [1]=>
//  string(10) "Derick Ret"
//}
//11(?P<name> ...) 创建一个有名字的子正则式
preg_match('/(?P<century>[12][0-9])(?P<year>[0-9]{2})/','PHP in 2005',$matches);
var_dump($matches);